约 2327 字

约 12 分钟

#C 语言标准库头文件 setjmp.h

这个头文件提供 非局部跳转 的相关功能,例如遇到错误时进行跳出。

#类型

类型标准说明
jmp_bufC89用于跳转的执行上下文

#宏

宏标准说明
setjmpC89保存用于跳转的执行上下文

#函数

函数标准说明
longjmpC89跳转到指定的执行上下文,跳转后无法返回

#推荐阅读

#示例

#include <stdio.h>
#include <setjmp.h>
#include <stdlib.h>

// 定义一个跳转缓冲区
jmp_buf jump_buffer;

void function_with_error(int condition) {
    printf("进入可能出错的函数\n");
    
    if (condition) {
        printf("检测到错误条件,准备跳转\n");
        // 跳转回setjmp的位置,并返回非0值
        longjmp(jump_buffer, 1);
    }
    
    printf("正常执行完毕\n");
}

int main(void) {
    // 设置跳转点
    int ret = setjmp(jump_buffer);
    
    if (ret == 0) {
        printf("第一次调用setjmp,准备调用可能出错的函数\n");
        function_with_error(0);  // 正常调用
        function_with_error(1);  // 会触发跳转
    } else {
        printf("从longjmp返回,错误码: %d\n", ret);
        printf("执行错误处理流程...\n");
    }
    
    printf("程序继续执行...\n");
    
    // 另一个示例:模拟异常处理
    if (setjmp(jump_buffer)) {
        printf("捕获到异常\n");
    } else {
        printf("尝试执行可能抛出异常的代码\n");
        // 模拟异常
        longjmp(jump_buffer, 42);
    }
    
    return 0;
}

运行结果:

第一次调用setjmp,准备调用可能出错的函数
进入可能出错的函数
正常执行完毕
进入可能出错的函数
检测到错误条件,准备跳转
从longjmp返回,错误码: 1
执行错误处理流程...
程序继续执行...
尝试执行可能抛出异常的代码
捕获到异常

更新: 2026/1/19

作者: PlanC

创建: 2025/6/13